	
/***********************************************************/
// 程序名称：createList.cpp
// 程序目的：设计一个将输入的数据建立成链表的程序
// 程序来源：数据结构(C语言版) P-60
// 日期：2013-8-13 16:12:30
/***********************************************************/

#include <stdio.h>
#include <stdlib.h>
#define Max 10
struct List         // Node声明
{
    int Number;
    char Name[Max];
    struct List* Next;
};
typedef struct List Node;
typedef Node* Link;

/************************************************************************/
// 释放链表                             
/************************************************************************/
// void Free_List(Link Head)
// {
//     Link Pointer;

//     while (NULL != Head)
//     {
//         Pointer = Head;
//         Head = Head->Next;  // 下一个节点
//         free(Pointer);
//     }

//     return;
// }
void Free_List(Link Head)
{
    Link current;

    while (NULL != Head)
    {
        
        current = Head;
        Head = Head->Next;  // 下一个节点
        free(current);
    }

    return;
}


/************************************************************************/
// 输出链表数据
/************************************************************************/
void Print_List(Link Head)
{
    Link Pointer;
    Pointer = Head;
    while (NULL != Pointer)
    {
        printf("\n #####输出数据##### \n");
        printf("数据编号：%d\n", Pointer->Number);
        printf("数据名称：%s\n", Pointer->Name);
        Pointer = Pointer->Next;
    }
    return;
}

/************************************************************************/
// 建立链表
/************************************************************************/
Link Create_list(Link Head)
{
    int DataNum;        // 数据编号
    char DataName[Max]; // 数据名称
    Link New;           // 节点声明
    Link Pointer;
    int i;

    Head = (Link)malloc(sizeof(Node));  // 内存配置

    if (NULL == Head)
        printf("内存分配失败！！\n");
    else
    {
        DataNum = 1;            // 初始数据编号
        Head->Number = DataNum; // 首节点数据编号

        printf("请输入数据名称: ");
        scanf("%s", DataName);
        for (i = 0; i <= Max; i++)
            Head->Name[i] = DataName[i];
        Head->Next = NULL;

        Pointer = Head;     // Pointer设为首节点
        while (1)
        {
            DataNum++;      // 数据编号递增
            New = (Link)malloc(sizeof(Node));
            if (NULL != New)
            {
                printf("请输入数据名称: ");
                scanf("%s", DataName);
                if (DataName[0] == '0') // 输入0则结束输入
                        break;

                New->Number = DataNum;
                for (i = 0; i <= Max; i++)
                {
                    New->Name[i] = DataName[i];
                }
                New->Next = NULL;
            }
            else
                printf("内存分配失败！！\n");

            Pointer->Next = New;        // 新节点串接在原列表尾端
            Pointer = New;          // 列表尾端为新节点
        }
    }
    return Head;
}

/************************************************************************/
// 主程序                                                               
/************************************************************************/
int main(void)
{
    Link Head = NULL;               // Node声明并初始化
    Link New_List;
    New_List = Create_list(Head);   // 建立链表

    if (New_List != NULL)
    {
        Print_List(New_List);
        Free_List(New_List);
    }

    return 0;
}